package com.xzx.annotation.config;

import com.xzx.annotation.bean.Blue;
import com.xzx.annotation.bean.ColorFactoryBean;
import com.xzx.annotation.bean.Person;
import com.xzx.annotation.bean.Red;
import com.xzx.annotation.condition.LinuxCondition;
import com.xzx.annotation.condition.MyImportSelector;
import com.xzx.annotation.condition.WindowCondition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
 * @author xinzhixuan
 * @version V1.0
 * @date 2018/7/14 15:45
 */
// 这个注解等价于一个xml配置文件
@Configuration
@Conditional(WindowCondition.class)// 这个条件对这个类中所有的bean都有效
@Import({Blue.class, Red.class, MyImportSelector.class})
public class MainConfig3 {

    // 这个标签等价一个bean标签， 返回值是class，方法名是bean的id
    @Bean
    public Person person() {
        return new Person("张三", 20);
    }

    /**
     * @Conditional({Condition}) ： 按照一定的条件进行判断，满足条件给容器中注册bean
     *
     * 如果系统是windows，给容器中注册("bill")
     * 如果是linux系统，给容器中注册("linus")
     */
    @Bean("bill")
    public Person person01() {
        return new Person("bill", 20);
    }

    @Conditional(LinuxCondition.class)
    @Bean("linus")
    public Person person02() {
        return new Person("linus", 20);
    }


    /**
     * 给容器中注册组件；
     * 1）、包扫描+组件标注注解（@Controller/@Service/@Repository/@Component）[自己写的类]
     * 2）、@Bean[导入的第三方包里面的组件]
     * 3）、@Import[快速给容器中导入一个组件]
     * 		1）、@Import(要导入到容器中的组件)；容器中就会自动注册这个组件，id默认是全类名
     * 		2）、ImportSelector:返回需要导入的组件的全类名数组；
     * 		3）、ImportBeanDefinitionRegistrar:手动注册bean到容器中
     * 4）、使用Spring提供的 FactoryBean（工厂Bean）;
     * 		1）、默认获取到的是工厂bean调用getObject创建的对象
     * 		2）、要获取工厂Bean本身，我们需要给id前面加一个&
     * 			&colorFactoryBean
     */

    @Bean
    public ColorFactoryBean colorFactoryBean() {
        return new ColorFactoryBean();
    }
}
